package core.voyageur;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;

import core.ClasseVol;
import core.compagnie.CarteFidelite;
import core.compagnie.CompAerienne;
import core.compagnie.MetaCompagnie;
import core.vols.VolInstance;


public class Client {
	
	protected String nom;
	protected String prenom;
	
	protected Hashtable<String, CarteFidelite> cartes;
	
	private ArrayList<Billet> billets;
	private Trajet trajet;

	/**
	 * @param nom
	 * @param prenom
	 */
	public Client(String nom, String prenom) {
		super();
		this.nom = nom;
		this.prenom = prenom;
		cartes = new Hashtable<String, CarteFidelite>();
		billets = new ArrayList<Billet>();
	}
	
	public Client(Client c) {
		this.nom = c.nom;
		this.prenom = c.prenom;
		this.billets = c.billets;
		this.cartes = c.cartes;
		this.trajet = c.trajet;
	}

	/**
	 * Met à jour le trajet avec le trajet du billet courant
	 * 
	 */
	private void majTrajetCourant() {
		if(!billets.isEmpty()) trajet.majTrajet(billets.get(0));
	}

	public void acheterBillet(Trajet t, Hashtable<VolInstance, ClasseVol> classes) {
		Billet newBillet = new Billet(this, t.getTrajet(), classes);
		billets.add(newBillet);
		sortBillets();
		for(VolInstance v : t.getTrajet()) {
			v.addCandidat(this);
		}
	}
	
	private void sortBillets() {
			Collections.sort(billets);
	}
	
	/**
	 * @return the nom
	 */
	public String getNom() {
		return nom;
	}

	/**
	 * @return the prenom
	 */
	public String getPrenom() {
		return prenom;
	}

	/**
	 * @return the cartes
	 */
	public ArrayList<CarteFidelite> getCartes() {
		return new ArrayList<CarteFidelite>(cartes.values());
	}
	
	public Hashtable<String, CarteFidelite> getCartesTable() {
		return cartes;
	}
	
	public void addCarte (CarteFidelite c) {
		if(c.getCompagnie() != null) cartes.put(c.getCompagnie().getCode(), c);
		else cartes.put(c.getMetaCompagnie().getNom(), c);
	}
	
	public void removeCarte (CarteFidelite c) {
		cartes.remove(c);
	}
	
	public void removeCarte (int ind) {
		cartes.remove(ind);
	}
	
	public String toString() {
		String s = prenom + " " + nom;
		return s;
	}

	public ArrayList<Billet> getBillets() {
		return billets;
	}

	
	public CarteFidelite carteFromCompagnie(CompAerienne comp) {
		if(cartes.containsKey(comp.getCode())) return cartes.get(comp.getCode());
		else return null;
	}
	
	public CarteFidelite carteFromCompagnie(MetaCompagnie comp) {
		if(cartes.containsKey(comp.getNom())) return cartes.get(comp.getNom());
		else return null;
	}

	
	public boolean contientCarte (MetaCompagnie m) {
		Iterator<CarteFidelite> itc = cartes.values().iterator();
		while(itc.hasNext()) {
			if (itc.next().getMetaCompagnie() == m) {
				return true;
			}
		}
		return false;
	}
	
	public boolean contientCarte (CompAerienne c) {
		Iterator<CarteFidelite> itc = cartes.values().iterator();
		while(itc.hasNext()) {
			if (itc.next().getCompagnie() == c) {
				return true;
			}
		}
		return false;
	}
		
}
